/**
 * 节流函数
 * @param func 需要节流的函数
 * @param interval 时间间隔(毫秒)
 * @returns 节流处理后的函数
 */
export function throttle<T extends (...args: any[]) => any>(func: T, interval: number): (...args: Parameters<T>) => void {
    let lastExecTime = 0
    let timeoutId: NodeJS.Timeout | null = null

    return function (this: ThisParameterType<T>, ...args: Parameters<T>): void {
        const now = Date.now()
        const elapsed = now - lastExecTime

        // 如果有等待执行的定时器，清除它
        if (timeoutId) {
            clearTimeout(timeoutId)
            timeoutId = null
        }

        // 如果距离上次执行已经超过间隔时间，立即执行
        if (elapsed >= interval) {
            func.apply(this, args)
            lastExecTime = now
        } else {
            // 否则设置定时器，在剩余时间后执行
            timeoutId = setTimeout(() => {
                func.apply(this, args)
                lastExecTime = Date.now()
                timeoutId = null
            }, interval - elapsed)
        }
    }
}
